package com.aisile.admin.gateway.filter;

import com.aisile.admin.gateway.utils.AppJwtUtil;
import io.jsonwebtoken.Claims;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @Auther:yry
 * @Date:2024/7/12 0012
 * @VERSON:1.0
 */
@Component
public class AuthorFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 放行登录路径
        ServerHttpRequest request =  exchange.getRequest();
        ServerHttpResponse response =  exchange.getResponse();

       try {
           if(request.getURI().getPath().contains("/login/in")){
               return chain.filter(exchange);
           }
           // 和前端也定的方式 获取token 然后 解析token
           /**
            * 1. 从头信息中获取  如果获取不到 再到请求参数获取 如果获取不到 再到cookie中获取（真实公司中 在一个地方获取即可）
            * 2. 获取到 直接调用jwt工具类 解析token  如果不报错 并且 claims对象不为空 证明token合法 直接放行即可
            * 3, 如果报错或者 claims为空 证明不合法或者没有用户信息 直接拦截 向前端放回 http状态码 401 未认证
            */
           // 先获取 请求头中的token 如果没有 获取请求参数中的token
           String token =  request.getHeaders().getFirst("token");
           if(token == null || "".equals(token.trim())){
               // 获取请求参数中的token
               token =  request.getQueryParams().getFirst("token");
               if(token == null || "".equals(token.trim())){
                   // 获取cookie 中的token
                   HttpCookie httpCookie =  request.getCookies().getFirst("token");
                   if(httpCookie!=null){
                       token = httpCookie.getValue().trim();
                   }
               }
           }
           if(token == null || "".equals(token.trim())){
               // 证明前端那种方式都没有给我  401, "Unauthorized"
               response.setStatusCode(HttpStatus.UNAUTHORIZED);
               return response.setComplete();
           }
           // 证明token有了  看看token有没有被篡改或者过期
           Claims claims =  AppJwtUtil.getClaimsBody(token);
           if(claims==null){
               response.setStatusCode(HttpStatus.UNAUTHORIZED);
               return response.setComplete();
           }
           // 不为空 证明全合法  没有任何问题了
           request.mutate().header("token",token);
           return chain.filter(exchange);
       }catch (Exception e){
           // 证明前端那种方式都没有给我  401, "Unauthorized"
           response.setStatusCode(HttpStatus.UNAUTHORIZED);
           return response.setComplete();
       }
    }
}
